package binary_tree.Newcode;

import java.util.Arrays;
import java.util.Scanner;

class Test {
    static int mod = 1000000000+7;
    static int []add = new int[5003];
    static int [][]f = new int[5003][5003];
    static int ans = 0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //输入括号字符串
        String s =sc.next();
        sc.close();
        int len =s.length();
        char []arr = s.toCharArray();
        ans = work(len,arr);
        //获取镜像
        for(int i =1;i<=len;++i){
            if(arr[i-1]=='(') arr[i-1]=')';
            else arr[i-1]='(';
        }
        String s1 =  new String(arr);
        //字符串反转
        String s2 =new StringBuffer(s1).reverse().toString();
        ans=ans*work(len,s2.toCharArray())%mod;
        System.out.println(ans);

    }
    private static int work(int len,char []arr){
        int lcnt =0,rcnt =0,num=0;//未匹配的左右括号数，及右括号编号
        for(int i=1;i<=len;++i){
            if(arr[i-1]=='('){
                lcnt++;
            }else{
                rcnt++;
                num++;
                if(lcnt!=0) {
                    rcnt--;
                    lcnt--;
                }
                add[num]=rcnt; //记录最少需要添加左括号的数量，add单调不减
            }
        }
        for(int i =add[1];i<=len;++i){
            f[1][i]=1;
        }
        //n^3转移
//        for(int i=2;i<=num;i++){
//           for(int j=add[i];j<=len;++j){
//               for(int k=0;k<=j;++k){
//                   f[i][j]=(f[i][j]+f[i-1][j-k])%mod;
//
//               }
//           }
//        }

        for(int i=2;i<=num;++i){
            for(int j=0;j<=add[i];j++){
                f[i][add[i]]=(f[i][add[i]]+f[i-1][j])%mod;
            }
            for(int j=add[i]+1;j<=len;++j){
                f[i][j]=(f[i][j-1]+f[i-1][j])%mod;
            }
        }
        return f[num][rcnt];//返回答案
    }

}           //n^3转移
//        for(int i=2;i<=num;i++){
//           for(int j=add[i];j<=len;++j){
//               for(int k=0;k<=j;++k){
//                   f[i][j]=(f[i][j]+f[i-1][j-k])%mod;
//
//               }
//           }
//        }
            for(int i=2;i<=num;++i){
                for(int j=0;j<=add[i];j++){
                    f[i][add[i]]=(f[i][add[i]]+f[i-1][j])%mod;
                }
                for(int j=add[i]+1;j<=len;++j){
                    f[i][j]=(f[i][j-1]+f[i-1][j])%mod;
                }
            }
            return f[num][rcnt];
        }

    }


